package net.lucamasini.fantacalcio.server.model;

import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.tostring.RooToString;

@Entity
//@RooJavaBean
@RooToString
@RooEntity
public class Partita {

	public static class PartitaBuilder {
		private final Partita partita; 
		
		public PartitaBuilder(final Giornata giornata) {
			this.partita = new Partita();
			
			partita.giornata = giornata;
			giornata.getPartite().add(partita);
		}
		
		public PartitaBuilder withCasa(final String casa) {
			partita.casa = casa;
			
			return this;
		}
		
		public PartitaBuilder withTrasferta(final String trasferta) {
			partita.trasferta = trasferta;
			
			return this;
		}
		
		public PartitaBuilder withPronostico(String username,
				Pronostico pronostico) {
			
			pronostico.setPartita(partita);
			pronostico.setUsername(username);
			pronostico.setCasa(0);
			pronostico.setTrasferta(0);
			
			partita.getPronostici().put(username, pronostico);
			
			return this;
		}

		public Partita build() {
			return partita;
		}
	}
	
	@ManyToOne(targetEntity = Giornata.class)
    @JoinColumn
    @NotNull
    private Giornata giornata;
    
    @ManyToOne(targetEntity = Risultato.class)
    @JoinColumn
    private Risultato risultato;

    private String casa;

    private String trasferta;

    @OneToMany(cascade = CascadeType.ALL, mappedBy="giornata")
    @MapKey(name="username")
    private Map<String, Pronostico> pronostici = new java.util.HashMap<String, Pronostico>();

	public Giornata getGiornata() {
		return giornata;
	}

	public void setGiornata(Giornata giornata) {
		this.giornata = giornata;
	}

	public Risultato getRisultato() {
		return risultato;
	}

	public void setRisultato(Risultato risultato) {
		this.risultato = risultato;
	}

	public String getCasa() {
		return casa;
	}

	public void setCasa(String casa) {
		this.casa = casa;
	}

	public String getTrasferta() {
		return trasferta;
	}

	public void setTrasferta(String trasferta) {
		this.trasferta = trasferta;
	}

	public Map<String, Pronostico> getPronostici() {
		return pronostici;
	}

	public void setPronostici(Map<String, Pronostico> pronostici) {
		this.pronostici = pronostici;
	}

}
